"我不管你們用了多少台伺服器,我只要看到結果!"
週三早上的技術架構會議,會議室的白板上畫滿了複雜的系統架構圖。箭頭四處飛舞,方框層疊交錯,看起來像是一張混亂的地鐵路線圖。
系統架構師老王正在解釋:「我們的系統目前有 15 個微服務,包括用戶服務、訂單服務、支付服務、物流服務、庫存服務...」
老闆皺著眉頭,手裡的咖啡杯都快捏變形了:「停停停!我聽不懂這些!」
「還有 Redis 快取、MongoDB 文檔庫、PostgreSQL 關聯式資料庫、Elasticsearch 搜尋引擎、RabbitMQ 訊息佇列...」老王繼續介紹。
「夠了!」老闆站起來,在白板上畫了一個大大的圓圈,「我只要一個按鈕!點下去,所有東西都自動運作!我不需要知道後面有多少台電腦在跑!」
產品經理阿強試圖解釋:「但是這些系統都有不同的介面和協定...」
「那就做一個萬能遙控器!」老闆的眼神發亮,「就像家裡的萬能遙控器一樣,一個按鈕控制電視、音響、冷氣、燈光!我不需要拿十幾個遙控器!」
老王嘗試說明技術複雜性:「每個服務都有自己的 API 和資料格式...」
「我不管!」老闆在白板上又畫了一個更大的圓圈,「我要一個『超級儀表板』!輸入一個指令,系統自動知道要呼叫哪些服務,要怎麼組合資料,要怎麼處理錯誤!」
此時你突然意識到,老闆並不是在無理取鬧,而是在直覺地描述 Facade Pattern 的核心概念 - 為複雜系統提供一個簡化的統一介面。
老闆最後總結:「我們要成為『複雜度隱藏大師』!不管後面多混亂,前面一定要簡潔!」
Facade Pattern(外觀模式)是結構型設計模式中的簡化大師,它的核心思想是:為複雜的子系統提供一個簡化的統一介面,讓客戶端可以更容易地使用這些子系統。
在我們的職場災難中,老闆的簡化需求完美地展現了為什麼需要 Facade Pattern:
Facade Pattern 適用於以下情境:
Facade Pattern 的優勢:
讓我們來實作一個簡化的「企業系統門面」,展示 Facade Pattern 的核心概念:
// 子系統 1:用戶服務
class UserService {
getUser(id: string): any {
console.log(`[用戶服務] 獲取用戶 ${id}`);
return { id, name: `User ${id}` };
}
}
// 子系統 2:訂單服務
class OrderService {
getOrders(userId: string): any[] {
console.log(`[訂單服務] 獲取用戶 ${userId} 的訂單`);
return [{ id: "ORD001", amount: 1500 }];
}
}
// 子系統 3:支付服務
class PaymentService {
processPayment(orderId: string, amount: number): boolean {
console.log(`[支付服務] 處理支付 ${orderId}: $${amount}`);
return true;
}
}
// 子系統 4:通知服務
class NotificationService {
sendEmail(userId: string, message: string): boolean {
console.log(`[通知服務] 發送郵件給 ${userId}: ${message}`);
return true;
}
}
// Facade Pattern 核心 - 企業門面
class EnterpriseFacade {
private userService: UserService;
private orderService: OrderService;
private paymentService: PaymentService;
private notificationService: NotificationService;
constructor() {
this.userService = new UserService();
this.orderService = new OrderService();
this.paymentService = new PaymentService();
this.notificationService = new NotificationService();
}
// 複雜業務操作的簡化介面
processOrder(userId: string, amount: number): boolean {
console.log(`\n=== 老闆的一鍵下單 ===`);
// 1. 獲取用戶資料
const user = this.userService.getUser(userId);
// 2. 獲取訂單資料
const orders = this.orderService.getOrders(userId);
// 3. 處理支付
const paymentSuccess = this.paymentService.processPayment("ORD001", amount);
// 4. 發送通知
if (paymentSuccess) {
this.notificationService.sendEmail(userId, "訂單成功");
return true;
}
return false;
}
}
// 使用範例
const facade = new EnterpriseFacade();
// 老闆只需要一個方法,就能完成複雜的業務流程
const success = facade.processOrder("user123", 1000);
console.log(`訂單處理${success ? "成功" : "失敗"}`);
// 輸出:
// === 老闆的一鍵下單 ===
// [用戶服務] 獲取用戶 user123
// [訂單服務] 獲取用戶 user123 的訂單
// [支付服務] 處理支付 ORD001: $1000
// [通知服務] 發送郵件給 user123: 訂單成功
// 訂單處理成功
Facade 設計原則:
與老闆溝通策略:
技術實作要點:
架構決策建議:
到此為止,我們已經完成了 Day5 到 Day10 的文章!從創建型模式的 Prototype Pattern 和 Abstract Factory Pattern,到第一週的總結,再進入結構型模式的 Adapter、Decorator 和 Facade Pattern。
下週將繼續探索更多結構型模式,包括 Proxy Pattern、Composite Pattern 和 Bridge Pattern,讓我們的設計模式武器庫更加完整!
老闆的需求越來越複雜,但我們的架構技能也越來越強大! 🚀